{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([[5, 1], [4, 2], [2, 5], [1, 4], [3, 2], [2, 5]])#TODO\n",
    "\n",
    "y = np.array([0, 0, 1, 1, 0, 1])#TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义 k 的值\n",
    "k = 1\n",
    "knn = KNeighborsClassifier(n_neighbors=k)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)# TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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v39/NGnSRONn5MiRuHPnDnbu3KlT3nXr1sW3336Lc+fO4bfffsOQIUNga2ur0cfX1xd79+5Feno6bt++rdP4hRo0aIAuXbpg7NixOH78OBISEjB27FitZ7GIqOKwMCKiYjk6OsLR0bHY7R999BH69euHoUOHonnz5vj333/x888/F1knM2TIEPz+++/o27dvkSLjUXZ2djhw4ABq1qyJvn37omHDhhg5ciQePnyoNY5Tp07h999/R79+/Ypsc3BwQGhoqM73NFq5ciVu376NwMBADB06VH07gkd9+umniI2N1XoLA12sXbsWzzzzDNq3b48XX3wRY8aMgYODA2xsbJ54TCIqH0nwC20iokrh6tWr8Pb2xi+//ILOnTsbOxyipxILIyIiI/n1119x//59NG3aFGlpaZg2bRpSUlLwzz//FFm4TUQVg1elEREZiVKpxIwZM3Dx4kU4ODjgueeew/r161kUERkRzxgRERERqXDxNREREZEKCyMiIiIiFRZGRERERCosjIiIiIhUWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFEREREZHK/wHnak/lmkmmkwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolor='k', s=100)#TODO\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], marker='x', color='red', markersize=8)#TODO\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)#TODO\n",
    "nearest = X[idx[0, 0]]#TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')#TODO\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()\n",
    "prediction[0]  # 输出预测结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
